#!/usr/bin/env python3
"""
脚本名称：13_exe.py
面试描述：Python 中的的迭代器和生成器有什么区别?
考察点: 理解生成器是迭代器的语法糖（但更简洁）
生活比喻：
作者：Gavin
创建日期：2025-05-27
版本：1.0
依赖库：无
使用方法： python 13_exe.py
"""

print("1. 迭代器")


# 1. 迭代器
class Counter:
    def __init__(self, max_num):
        self.max_num = max_num

    def __iter__(self):
        self.n = 0
        return self

    def __next__(self):
        if self.n >= self.max_num:
            raise StopIteration
        self.n += 1
        return self.n


# 使用迭代器
counter = Counter(3)
for num in counter:
    print(num)  # 输出: 1 2 3

# 2. 生成器
print("\n2. fibonacci 生成器")


def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b


# 使用生成器（惰性生成无限序列）
fib = fibonacci()
print(next(fib))  # 0
print(next(fib))  # 1
print(next(fib))  # 1
print(next(fib))  # 2

# 3. 生成器表达式
print("\n3. 生成器表达式")
# 类似列表推导，但返回生成器
squares = (x ** 2 for x in range(10))

print(next(squares))  # 0
print(next(squares))  # 1
print(next(squares))  # 4
print(list(squares))  # [9, 16, ...], StopIteration
